{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Lecture 1: Multiplication\n",
    "\n",
    "In this IPython notebook, we implement the algorithms that we discussed in class for multiplying integers.\n",
    "\n",
    "## The goal:\n",
    "\n",
    "Multiply two n-digit integers. \n",
    "\n",
    "## The rules: \n",
    "\n",
    "We are allowed to use Python's built-in multiplication to do one-digit multiplications (eg, 6 times 7), but not any other multiplication (eg, 66 times 77).  We are allowed to use Python's built-in addition (even of large numbers)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "# first include a few helper functions that will be useful (like turning integers to digits and back)\n",
    "from multHelpers import *\n",
    "# set up matplotlib, for plotting stuff.\n",
    "%matplotlib inline\n",
    "import matplotlib\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Here's our benchmark: grade-school multiplication.\n",
    "\n",
    "This is probably (equivalent to) the algorithm you learned in grade school."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "# look at each pair of digits, and add them up with appropriate shifts.\n",
    "def gradeSchoolMult( X, Y ): # X and Y are integers\n",
    "    x = getDigits(X)\n",
    "    y = getDigits(Y)\n",
    "    summands = []\n",
    "    for xDigit in range(len(x)):\n",
    "        currentXDigit = x[len(x) - xDigit -1]\n",
    "        z = [0 for i in range(xDigit)] # z is the digits of xDigit times y; start it out with some zeros\n",
    "        carry = 0\n",
    "        for yDigit in range(len(y)):\n",
    "            newProd = getDigits( currentXDigit * y[len(y) - yDigit - 1] + carry )\n",
    "            z.insert( 0, newProd[-1] ) # put the new digit at the front of our new summand\n",
    "            if len(newProd) > 1:\n",
    "                carry = newProd[0]\n",
    "            else:\n",
    "                carry = 0\n",
    "        z.insert(0, carry)\n",
    "        summands.append(makeInt(z))\n",
    "    return sum(summands) # finally add them all together"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "807803114007\n",
      "807803114007\n"
     ]
    }
   ],
   "source": [
    "# make sure it works on an example:\n",
    "\n",
    "## NOTE: when testing your own code (for anything, not just this class), you'd want to do much more thorough tests!  \n",
    "\n",
    "X = 1234567\n",
    "Y = 654321\n",
    "print(gradeSchoolMult(X,Y))\n",
    "print(X*Y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's see how long this takes!  We'll try it a bunch of times and graph it.  \n",
    "\n",
    "#### *NOTE*: Don't worry too much (at all) about the plotting code below, you'll never have to generate that for yourself in this course.\n",
    "\n",
    "#### *NOTE*: This should work fine if you installed Jupyter using anaconda but if you did it in a different way you may need to install matplotlib."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Generate some evaluation points\n",
    "nVals = [2**k for k in range(9)] # let's try it at a bunch of powers of 2, we'll see why later...\n",
    "nVals += [k*10 for k in range(10)]\n",
    "nVals += [k*50 for k in range(2,11)]# plus some spaced-out points...\n",
    "nVals.sort() # put them in order\n",
    "\n",
    "# multABunch (included from multABunch.py) just runs this algorithm a bunch of times.\n",
    "nValsGS, tValsGS = multABunch(gradeSchoolMult, nVals, numTrials=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "nice polynomial is 25.733174036103375 + -1.121642596052948 *x +  0.010978090560087354 x^2\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Multiplying n-digit integers')"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Now make a pretty picture!  \n",
    "\n",
    "plt.plot(nValsGS, tValsGS, color=\"red\", label=\"Grade School Multiplication on laptop\")\n",
    "# after we look at the data, change the False flag to True to fit a quadratic\n",
    "if True:\n",
    "    coeffs = np.polyfit( nValsGS, tValsGS, 2 )\n",
    "    plt.plot(nValsGS, [ coeffs[2] + coeffs[1]*n + coeffs[0]*n**2 for n in nValsGS], color=\"purple\", label=\"nice quadratic\")\n",
    "    print(\"nice polynomial is\", coeffs[2] ,\"+\", coeffs[1],\"*x + \", coeffs[0] , \"x^2\")\n",
    "plt.xlabel(\"n\")\n",
    "plt.ylabel(\"Time(ms)\")\n",
    "plt.legend()\n",
    "plt.title(\"Multiplying n-digit integers\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Multiplying n-digit integers')"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Let's try interpolating this out a bit (see slides for context)\n",
    "\n",
    "nValsTmp = range(10000)\n",
    "plt.plot(nValsTmp, [ coeffs[2] + coeffs[1]*n + coeffs[0]*n**2 for n in nValsTmp], color=\"red\", label=\"GSMult on Laptop (projected via nice quadratic)\")\n",
    "#plt.plot(nValsGS, tValsGS, color=\"red\", label=\"Grade School Multiplication on laptop\")\n",
    "plt.plot(nValsTmp, [ n**(1.6)/10 + 100 for n in nValsTmp], \"--\" , color=\"green\", label=\"Magic Multiplication Algorithm by hand\")\n",
    "plt.plot(nValsTmp, [ n**(2)/10 + 100 for n in nValsTmp], color=\"orange\", label=\"Grade School Multiplication by hand\")\n",
    "plt.xlabel(\"n\")\n",
    "plt.ylabel(\"Time(ms)\")\n",
    "plt.ylim(0,500000)\n",
    "plt.xlim()\n",
    "plt.legend()\n",
    "plt.title(\"Multiplying n-digit integers\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Now let's try a divide-and-conquer solution!\n",
    "\n",
    "This algorithm breaks one size-n multiplication into four size n/2 multiplications, and recurses."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "def divideAndConquerMult1( X, Y ):\n",
    "    return divideAndConquerMult1_helper( getDigits(X), getDigits(Y) )\n",
    "\n",
    "def divideAndConquerMult1_helper( x, y ):\n",
    "    n = max( len(x), len(y) )\n",
    "    # pad the shorter one with zeros until it's the same length\n",
    "    while len(x) < n:\n",
    "        x.insert(0,0)\n",
    "    while len(y) < n:\n",
    "        y.insert(0,0)\n",
    "    if n == 1:\n",
    "        return x[0]*y[0] # this is the base case, we are allowed to multiply one-digit integers :)\n",
    "    mid = round(n/2)\n",
    "    xhigh = x[:mid] # this is [ x[0], x[1], ..., x[mid-1] ]\n",
    "    xlow = x[mid:] # this is [ x[mid], ..., x[n-1] ]\n",
    "    yhigh = y[:mid]\n",
    "    ylow = y[mid:]\n",
    "    highhigh = divideAndConquerMult1_helper( xhigh , yhigh )\n",
    "    highlow = divideAndConquerMult1_helper( xhigh , ylow )\n",
    "    lowhigh = divideAndConquerMult1_helper( xlow , yhigh )\n",
    "    lowlow = divideAndConquerMult1_helper( xlow , ylow )\n",
    "    \n",
    "    # now shift things appropriately (see slides for explanation) and add them together\n",
    "    HH = getDigits(highhigh) + [ 0 for i in range(2*(n - mid))]\n",
    "    MID = getDigits(lowhigh + highlow) + [0 for i in range(n-mid)]\n",
    "    LL = getDigits(lowlow)\n",
    "    result = makeInt(HH) + makeInt(MID) + makeInt(LL)\n",
    "    return result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "807803114007\n",
      "807803114007\n"
     ]
    }
   ],
   "source": [
    "# make sure it works on an example:\n",
    "\n",
    "X = 1234567\n",
    "Y = 654321\n",
    "print(divideAndConquerMult1(X,Y))\n",
    "print(X*Y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "How fast is this?  Let's try it!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [],
   "source": [
    "nValsRec, tValsRec = multABunch(divideAndConquerMult1, nVals, numTrials=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Multiplying n-digit integers')"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(nValsGS, tValsGS, color=\"red\", label=\"Grade School Multiplication\")\n",
    "plt.plot(nValsRec, tValsRec, color=\"blue\", label=\"Divide and Conquer I\")\n",
    "plt.xlabel(\"n\")\n",
    "plt.ylabel(\"Time(ms)\")\n",
    "plt.legend()\n",
    "plt.title(\"Multiplying n-digit integers\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Hmm...pretty hard to tell from this plot which one is asymptotically better.  (And there's definitely something weird going on at powers of two in the divide-and-conquer implementation above).  We'll need to turn to some mathematical analysis to understand how this algorithm behaves as n gets large."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "## Karatsuba multiplication\n",
    "\n",
    "The previous algorithms ended up both using about n^2 operations.  Karatsuba multiplication will do better!  It is also a divide-and-conquer approach, but turns one multiplication of size n into three multiplications of size n/2."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "def karatsuba( X, Y ):\n",
    "    return karatsuba_helper( getDigits(X), getDigits(Y))\n",
    "\n",
    "def karatsuba_helper( x, y ):  \n",
    "    n = max( len(x), len(y) )\n",
    "    # pad the shorter one with zeros until it's the same length\n",
    "    while len(x) < n:\n",
    "        x.insert(0,0)\n",
    "    while len(y) < n:\n",
    "        y.insert(0,0)\n",
    "    if n == 1:\n",
    "        return x[0]*y[0] # this is the base case, we are allowed to multiply one-digit integers :)\n",
    "    mid = round(n/2)\n",
    "    xhigh = x[:mid] # this is [ x[0], x[1], ..., x[mid-1] ]\n",
    "    xlow = x[mid:] # this is [ x[mid], ..., x[n-1] ]\n",
    "    yhigh = y[:mid]\n",
    "    ylow = y[mid:]\n",
    "    highhigh = karatsuba_helper( xhigh , yhigh )\n",
    "    lowlow = karatsuba_helper( xlow , ylow )\n",
    "    tmpTerm = karatsuba_helper( getDigits( makeInt(xlow) + makeInt(xhigh) ) , getDigits( makeInt(ylow) + makeInt(yhigh) ) )\n",
    "    middleTerm = tmpTerm - highhigh - lowlow # this is equal to highlow + lowhigh in divideAndConquerMult1\n",
    "    HH = getDigits(highhigh) + [ 0 for i in range(2*(n - mid))]\n",
    "    MID = getDigits(middleTerm) + [0 for i in range(n-mid)]\n",
    "    LL = getDigits(lowlow)\n",
    "    result = makeInt(HH) + makeInt(MID) + makeInt(LL)\n",
    "    return result"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "807803114007\n",
      "807803114007\n"
     ]
    }
   ],
   "source": [
    "# make sure it works on an example:\n",
    "\n",
    "X = 1234567\n",
    "Y = 654321\n",
    "print(karatsuba(X,Y))\n",
    "print(X*Y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [],
   "source": [
    "nValsKarat, tValsKarat = multABunch(karatsuba, nVals, numTrials=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Multiplying n-digit integers')"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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aTevaty4ccrii5988gktW7YkKiqKe++9l6SkpJTrevbZZ7niiiv49ddfffgNpTZlyhR69OiRqmzDhg307NmTjz/+mJYtWwLw+++/06ZNG5o1a0abNm1Slr33ddn8tMu079u3j/bt2xMVFUXjxo1TZsV71/imT5/OnXfemfJ47ty5tGvXjssvv5xvvvkGsLXSdu3aER0dTXR0dKq1wHr27JmyNIrKYyZOtE1UL70EtWq5HU2KglnjiH0QjubwsuploqC5f4sn1q5dm+TkZA4cOJBSFhISQo8ePZgxYwaDBg1i6dKlREREULFixVSvHTRoEG+//TYdOnRItdTFxIkTKVWqFMuWLePs2bO0bduWLl26UCvNP7pJkyZRtmxZTp8+TYsWLejduzflypXj5MmTtGrVihdffJHHHnuM9957j6effpoHHniAf/zjHwwYMCBVovK2bt26lCXe0/ryyy9ZtWoVq1ev5tChQ7Ro0YL27dsDdse/9evXU6VKFdq2bcuSJUuIiYnhnnvu4aeffuKyyy6jX79+WX6eGzZsYNq0aSxZsoSwsDCGDRvGlClTGDBgACdPnqRx48a88MILWZ4nPUuWLElZYdejR48efPLJJ1x55ZUpZfXr12fRokUUKlSIuXPn8uSTT6YsbunLsvlpl2l/9dVXufbaa3nqqadISkrKdH0zj7i4OBYuXMi2bdu46qqr2Lp1KxUqVGDOnDmEh4ezZcsW+vfvn9IkFxMTw9NPP31Rn4vKRbt25bkmKg+tcbgsvSVf+vXrl/KNfOrUqRf80UxISODYsWN06NABgDvuuCPluR9//JGPPvqIqKgorrjiCg4fPsyWLVsueI+33norpVaxe/fulGMKFy6c8s3eexl17z+c3u/nq8WLF9O/f39CQ0OpWLEiHTp0SFlOvmXLllSrVo2QkBCioqKIi4tj48aN1KpVi7p16yIi3H777Vm+x7x584iNjaVFixZERUUxb968lD6J0NBQevfu7XfcHvv27aN8+fKpyjp37sz777+fUqsB+7vp27cvjRs35qGHHmL9+vUpz6W3bH7Tpk3p3Llzhsu0t2jRgg8++IBRo0axdu1aLrnkkixjvfnmmwkJCaFu3brUrl2bjRs3cv78ee655x6aNGlC3759+eOPP1KOr1ChAnv37vX7M1G5yBi4+25ITs5TTVQeBbPG4WfNILds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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(nValsGS, tValsGS, color=\"red\", label=\"Grade School Multiplication\")\n",
    "#plt.plot(nValsRec, tValsRec, color=\"grey\", label=\"Divide and Conquer I\")\n",
    "plt.plot(nValsKarat, tValsKarat, color=\"orange\", label=\"Divide and Conquer II (Karatsuba)\")\n",
    "plt.xlabel(\"n\")\n",
    "plt.ylabel(\"Time(ms)\")\n",
    "plt.legend()\n",
    "plt.title(\"Multiplying n-digit integers\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Cool, it does seem to work better than grade-school multiplication!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
